Gas Station Data
Interactive Map
GasStation <- na.omit(read.csv(file = "https://raw.githubusercontent.com/azheneghan/aheneghan/main/datasets/POC.csv"))
rs.gs <- GasStation[sample(nrow(GasStation), size=500), ]
###
g <- list( scope = 'usa',
projection = list(type = 'albers usa'),
showland = TRUE,
landcolor = toRGB("gray95"),
subunitcolor = toRGB("gray85"),
countrycolor = toRGB("gray85"),
countrywidth = 0.5,
subunitwidth = 0.5
)
###
gs.map <- plot_geo(rs.gs, lat = ~ycoord, lon = ~xcoord) %>%
add_markers(text = ~paste(paste("State:", STATE),
paste("County:", county),
paste("Address:", ADDRESS),
paste("Zip Code:", ZIPnew),
sep = "<br>"),
color = ~description,
symbol = "circle",
hoverinfo = "text") %>%
#colorbar(title = "Incoming flights<br>2011.2") %>%
layout( title = 'Gas Stations in the United States',
geo = g)
gs.map
A plotly interactive scatter map was created to plot locations of
sampled gas stations across the United States. It seems that a great
number of the gas stations in the sample and overall population come
from eastern Texas, the coasts of California, and Florida. More gas
stations sampled across the U.S. are in the eastern half of the country
compared to the western half. It should also be said that the U.S.
states in the far northern and mid-western (Utah, Nebraska, Colorado,
Wyoming) regions of the country have few to no gas stations that were
sampled. This may imply there are not as many gas stations in the
northern and mid-western states as in other states. This could be
because human population sizes in those states are smaller compared to
states with more gas stations. The number of gas stations in a state
coud be proportional to population size of that state. As population
size increases in a state, so do the number of gas stations. Gas
stations sampled along the western and upper eastern coasts of the U.S.
tended to all be from urban settings. The few gas stations sampled in
the northern states appear to be in rural settings.
Philly 2023 Crime Data
Interactive Map
PhillyCrime <- read.csv(file = "https://raw.githubusercontent.com/azheneghan/aheneghan/main/datasets/PhillyCrimeSince2015.csv")
PhillyCrime$date <- as.POSIXct(PhillyCrime$date, format = "%m/%d/%Y %H:%M")
PhillyCrime$year <- format(PhillyCrime$date, format="%Y")
crime.2023 <- PhillyCrime %>%
filter(year == "2023")
crime.2023 <- na.omit(crime.2023)
###
title <- tags$div(
HTML('<font color = "chocolate" size =4><b>Philadelphia Crime Case Locations 2023</b></font>')
)
AnnotateWrapper <- tags$div(
HTML('<center><img border="0" alt="ImageTitle" src="https://raw.githubusercontent.com/azheneghan/aheneghan/main/images/philadelphia.png" width="150" height="100"><center>
<font color = "darkgreen">2023</font>')
)
fatalColor <- rep("#DC267F")
fatalColor[which(crime.2023$fatal=="Nonfatal")] <- "#648FFF"
fatalColor[which(crime.2023$fatal=="Fatal")] <- "#DC267F"
##
label.msg <- paste(paste("Street:", crime.2023$street_name),
paste("<br> ZIP Code:", crime.2023$zip_code),
paste("<br> Neighborhood:", crime.2023$neighborhood),
paste("<br> Longitude:", crime.2023$lng),
paste("<br> Latitude:", crime.2023$lat))
##
leaflet(crime.2023) %>%
addTiles() %>%
setView(lng=mean(crime.2023$lng), lat=mean(crime.2023$lat), zoom = 13) %>%
addProviderTiles(providers$Esri.WorldGrayCanvas) %>%
addCircleMarkers(
~lng,
~lat,
color = fatalColor,
stroke = FALSE,
fillOpacity = 0.4,
popup = ~label.msg,
label = ~paste("Street:", crime.2023$street_name)) %>%
addLegend(position = "bottomright",
colors = c("#DC267F", "#648FFF"),
labels= c("Fatal", "Non-Fatal"),
title= "Crime Status",
opacity = 0.4) %>%
addControl(title, position = "topright") %>%
addControl(AnnotateWrapper, position = "bottomleft")
An interactive leaflet map was created to plot locations of crimes
that took place in Philadelphia, PA in 2023. Crimes were marked with
different colors to represent crimes that were fatal and crimes that
weren’t. Other relevant location information for each crime in 2023,
such as the street and neighborhood where they were, is included in a
popup (click each point).
Most of the points themselves appear to be mainly in two large
clusters on either side of the river while the others are lower down the
river or even more right of the cluster on the right side of the river.
There does not appear to be too much variation or any obvious patterns
in spread of fatal and non-fatal crimes across Philadelphia in 2023.
Most of the fatal and non-fatal crime locations seem to be relatively
close to one another. Some points, whether fatal or non-fatal, tend to
overlap since some crimes have more than one victim or criminal.
Non-fatal crimes seem to be more frequent compared to fatal crimes, and
only a few non-fatal crimes tend to stretch out past the aforementioned
clusters.
LS0tDQp0aXRsZTogIkdhcyBTdGF0aW9uIGFuZCBQaGlsbHkgMjAyMyBDcmltZSBEYXRhIEludGVyYWN0aXZlIE1hcHMiDQphdXRob3I6ICJBbmRyZXcgSGVuZWdoYW4iDQpkYXRlOiAiMy8yMC8yMDI0Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCmVkaXRvcl9vcHRpb25zOg0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KLyogVGFibGUgb2YgY29udGVudCAtIG5hdmlnYXRpb24gKi8NCg0KZGl2I1RPQyBsaSB7DQogICAgbGlzdC1zdHlsZTpub25lOw0KICAgIGJhY2tncm91bmQtY29sb3I6bGlnaHRncmF5Ow0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCiAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgICBjb2xvcjogIzc4MGMwYzsNCn0NCg0KLyogVGl0bGUgZm9udHMgKi8NCg0KaDEudGl0bGUgew0KICBmb250LXNpemU6IDI0cHg7DQogIGNvbG9yOiBkYXJrYmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgZm9udC12YXJpYW50LWNhcHM6IG5vcm1hbDsNCn0NCg0KaDQuYXV0aG9yIHsNCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IG5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7DQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogIGNvbG9yOiBkYXJrYmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQovKiBTZWN0aW9uIGhlYWRlcnMgKi8NCg0KaDEgew0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMiB7DQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsNCiAgICBmb250LXNpemU6IDE1cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgew0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBEZWNvcmF0aW9uIG9mIGh5cGVybGlua3MgICovDQoNCi8qIHVudmlzaXRlZCBsaW5rICovDQphOmxpbmsgew0KICBjb2xvcjogZ3JlZW47DQp9DQoNCi8qIHZpc2l0ZWQgbGluayAqLw0KYTp2aXNpdGVkIHsNCiAgY29sb3I6IHB1cnBsZTsNCn0NCg0KLyogbW91c2Ugb3ZlciBsaW5rICovDQphOmhvdmVyIHsNCiAgY29sb3I6IHJlZDsNCn0NCg0KLyogc2VsZWN0ZWQgbGluayAqLw0KYTphY3RpdmUgew0KICBjb2xvcjogeWVsbG93Ow0KfQ0KDQo8L3N0eWxlPg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgIGxpYnJhcnkodGlkeXZlcnNlKQ0KfQ0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwbG90bHkiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCiAgIGxpYnJhcnkocGxvdGx5KQ0KfQ0KaWYgKCFyZXF1aXJlKCJnYXBtaW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiZ2FwbWluZGVyIikNCiAgIGxpYnJhcnkoZ2FwbWluZGVyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJSQ3VybCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiUkN1cmwiKSAgICAgICAgICAgICAjIEluc3RhbGwgUkN1cmwgcGFja2FnZQ0KICAgIGxpYnJhcnkoIlJDdXJsIikNCn0NCmlmICghcmVxdWlyZSgiY29sb3VycGlja2VyIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJjb2xvdXJwaWNrZXIiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiY29sb3VycGlja2VyIikNCn0NCmlmICghcmVxdWlyZSgiZ2dhbmltYXRlIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZ2FuaW1hdGUiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2dhbmltYXRlIikNCn0NCmlmICghcmVxdWlyZSgiZ2lmc2tpIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnaWZza2kiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2lmc2tpIikNCn0NCmlmICghcmVxdWlyZSgibWFnaWNrIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJtYWdpY2siKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibWFnaWNrIikNCn0NCmlmICghcmVxdWlyZSgiZ3JEZXZpY2VzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnckRldmljZXMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ3JEZXZpY2VzIikNCn0NCmlmICghcmVxdWlyZSgibGVhZmxldCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZmxldCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJsZWFmbGV0IikNCn0NCmlmICghcmVxdWlyZSgibWFwcyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibWFwcyIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJtYXBzIikNCn0NCmlmICghcmVxdWlyZSgiaHRtbHRvb2xzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJodG1sdG9vbHMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiaHRtbHRvb2xzIikNCn0NCmlmICghcmVxdWlyZSgiaHRtbHdpZGdldHMiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImh0bWx3aWRnZXRzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImh0bWx3aWRnZXRzIikNCn0NCmlmICghcmVxdWlyZSgibGVhZmxlZ2VuZCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZmxlZ2VuZCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJsZWFmbGVnZW5kIikNCn0NCmlmICghcmVxdWlyZSgiZ2VvanNvbmlvIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZW9qc29uaW8iKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2VvanNvbmlvIikNCn0NCmlmICghcmVxdWlyZSgic3RyaW5naSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygic3RyaW5naSIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJzdHJpbmdpIikNCn0NCmlmICghcmVxdWlyZSgiUkNvbG9yQnJld2VyIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJSQ29sb3JCcmV3ZXIiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiUkNvbG9yQnJld2VyIikNCn0NCmlmICghcmVxdWlyZSgidGlncmlzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWdyaXMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgidGlncmlzIikNCn0NCmlmICghcmVxdWlyZSgibGVhZnBvcCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZnBvcCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJsZWFmcG9wIikNCn0NCmlmICghcmVxdWlyZSgibGVhZmVtIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJsZWFmZW0iKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibGVhZmVtIikNCn0NCmlmICghcmVxdWlyZSgidG1hcCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygidG1hcCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJ0bWFwIikNCn0NCmlmICghcmVxdWlyZSgidG1hcHRvb2xzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJ0bWFwdG9vbHMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgidG1hcHRvb2xzIikNCn0NCmlmICghcmVxdWlyZSgid2Vic2hvdDIiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIndlYnNob3QyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoIndlYnNob3QyIikNCn0NCmlmICghcmVxdWlyZSgic2YiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInNmIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoInNmIikNCn0NCmlmICghcmVxdWlyZSgidGVycmEiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInRlcnJhIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoInRlcnJhIikNCn0NCmlmICghcmVxdWlyZSgibGVhZnBvcCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZnBvcCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJsZWFmcG9wIikNCn0NCg0KIyMNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRSVUUsICAgDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQSkNCmBgYA0KDQojIEdhcyBTdGF0aW9uIERhdGEgSW50ZXJhY3RpdmUgTWFwDQoNCmBgYHtyfQ0KR2FzU3RhdGlvbiA8LSBuYS5vbWl0KHJlYWQuY3N2KGZpbGUgPSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F6aGVuZWdoYW4vYWhlbmVnaGFuL21haW4vZGF0YXNldHMvUE9DLmNzdiIpKQ0KcnMuZ3MgPC0gR2FzU3RhdGlvbltzYW1wbGUobnJvdyhHYXNTdGF0aW9uKSwgc2l6ZT01MDApLCBdDQojIyMNCmcgPC0gbGlzdCggICAgICBzY29wZSA9ICd1c2EnLA0KICAgICAgICAgICBwcm9qZWN0aW9uID0gbGlzdCh0eXBlID0gJ2FsYmVycyB1c2EnKSwNCiAgICAgICAgICAgICBzaG93bGFuZCA9IFRSVUUsDQogICAgICAgICAgICBsYW5kY29sb3IgPSB0b1JHQigiZ3JheTk1IiksDQogICAgICAgICBzdWJ1bml0Y29sb3IgPSB0b1JHQigiZ3JheTg1IiksDQogICAgICAgICBjb3VudHJ5Y29sb3IgPSB0b1JHQigiZ3JheTg1IiksDQogICAgICAgICBjb3VudHJ5d2lkdGggPSAwLjUsDQogICAgICAgICBzdWJ1bml0d2lkdGggPSAwLjUNCiAgICAgICApDQojIyMNCmdzLm1hcCA8LSBwbG90X2dlbyhycy5ncywgbGF0ID0gfnljb29yZCwgbG9uID0gfnhjb29yZCkgJT4lIA0KICBhZGRfbWFya2Vycyh0ZXh0ID0gfnBhc3RlKHBhc3RlKCJTdGF0ZToiLCBTVEFURSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlKCJDb3VudHk6IiwgY291bnR5KSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUoIkFkZHJlc3M6IiwgQUREUkVTUyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlKCJaaXAgQ29kZToiLCBaSVBuZXcpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAgPSAiPGJyPiIpLA0KICAgICAgICAgICAgICBjb2xvciA9IH5kZXNjcmlwdGlvbiwgDQogICAgICAgICAgICAgIHN5bWJvbCA9ICJjaXJjbGUiLCANCiAgICAgICAgICAgICAgaG92ZXJpbmZvID0gInRleHQiKSAgICU+JSANCiAgI2NvbG9yYmFyKHRpdGxlID0gIkluY29taW5nIGZsaWdodHM8YnI+MjAxMS4yIikgICU+JSANCiAgbGF5b3V0KCB0aXRsZSA9ICdHYXMgU3RhdGlvbnMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMnLCANCiAgICAgICAgICBnZW8gPSBnKQ0KZ3MubWFwDQpgYGANCg0KQSBwbG90bHkgaW50ZXJhY3RpdmUgc2NhdHRlciBtYXAgd2FzIGNyZWF0ZWQgdG8gcGxvdCBsb2NhdGlvbnMgb2Ygc2FtcGxlZCBnYXMgc3RhdGlvbnMgYWNyb3NzIHRoZSBVbml0ZWQgU3RhdGVzLiBJdCBzZWVtcyB0aGF0IGEgZ3JlYXQgbnVtYmVyIG9mIHRoZSBnYXMgc3RhdGlvbnMgaW4gdGhlIHNhbXBsZSBhbmQgb3ZlcmFsbCBwb3B1bGF0aW9uIGNvbWUgZnJvbSBlYXN0ZXJuIFRleGFzLCB0aGUgY29hc3RzIG9mIENhbGlmb3JuaWEsIGFuZCBGbG9yaWRhLiBNb3JlIGdhcyBzdGF0aW9ucyBzYW1wbGVkIGFjcm9zcyB0aGUgVS5TLiBhcmUgaW4gdGhlIGVhc3Rlcm4gaGFsZiBvZiB0aGUgY291bnRyeSBjb21wYXJlZCB0byB0aGUgd2VzdGVybiBoYWxmLiBJdCBzaG91bGQgYWxzbyBiZSBzYWlkIHRoYXQgdGhlIFUuUy4gc3RhdGVzIGluIHRoZSBmYXIgbm9ydGhlcm4gYW5kIG1pZC13ZXN0ZXJuIChVdGFoLCBOZWJyYXNrYSwgQ29sb3JhZG8sIFd5b21pbmcpIHJlZ2lvbnMgb2YgdGhlIGNvdW50cnkgaGF2ZSBmZXcgdG8gbm8gZ2FzIHN0YXRpb25zIHRoYXQgd2VyZSBzYW1wbGVkLiBUaGlzIG1heSBpbXBseSB0aGVyZSBhcmUgbm90IGFzIG1hbnkgZ2FzIHN0YXRpb25zIGluIHRoZSBub3J0aGVybiBhbmQgbWlkLXdlc3Rlcm4gc3RhdGVzIGFzIGluIG90aGVyIHN0YXRlcy4gVGhpcyBjb3VsZCBiZSBiZWNhdXNlIGh1bWFuIHBvcHVsYXRpb24gc2l6ZXMgaW4gdGhvc2Ugc3RhdGVzIGFyZSBzbWFsbGVyIGNvbXBhcmVkIHRvIHN0YXRlcyB3aXRoIG1vcmUgZ2FzIHN0YXRpb25zLiBUaGUgbnVtYmVyIG9mIGdhcyBzdGF0aW9ucyBpbiBhIHN0YXRlIGNvdWQgYmUgcHJvcG9ydGlvbmFsIHRvIHBvcHVsYXRpb24gc2l6ZSBvZiB0aGF0IHN0YXRlLiBBcyBwb3B1bGF0aW9uIHNpemUgaW5jcmVhc2VzIGluIGEgc3RhdGUsIHNvIGRvIHRoZSBudW1iZXIgb2YgZ2FzIHN0YXRpb25zLiBHYXMgc3RhdGlvbnMgc2FtcGxlZCBhbG9uZyB0aGUgd2VzdGVybiBhbmQgdXBwZXIgZWFzdGVybiBjb2FzdHMgb2YgdGhlIFUuUy4gdGVuZGVkIHRvIGFsbCBiZSBmcm9tIHVyYmFuIHNldHRpbmdzLiBUaGUgZmV3IGdhcyBzdGF0aW9ucyBzYW1wbGVkIGluIHRoZSBub3J0aGVybiBzdGF0ZXMgYXBwZWFyIHRvIGJlIGluIHJ1cmFsIHNldHRpbmdzLg0KDQoNCiMgUGhpbGx5IDIwMjMgQ3JpbWUgRGF0YSBJbnRlcmFjdGl2ZSBNYXANCg0KYGBge3J9DQpQaGlsbHlDcmltZSA8LSByZWFkLmNzdihmaWxlID0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hemhlbmVnaGFuL2FoZW5lZ2hhbi9tYWluL2RhdGFzZXRzL1BoaWxseUNyaW1lU2luY2UyMDE1LmNzdiIpDQpQaGlsbHlDcmltZSRkYXRlIDwtIGFzLlBPU0lYY3QoUGhpbGx5Q3JpbWUkZGF0ZSwgZm9ybWF0ID0gIiVtLyVkLyVZICVIOiVNIikNClBoaWxseUNyaW1lJHllYXIgPC0gZm9ybWF0KFBoaWxseUNyaW1lJGRhdGUsIGZvcm1hdD0iJVkiKQ0KY3JpbWUuMjAyMyA8LSBQaGlsbHlDcmltZSAlPiUNCiAgZmlsdGVyKHllYXIgPT0gIjIwMjMiKQ0KY3JpbWUuMjAyMyA8LSBuYS5vbWl0KGNyaW1lLjIwMjMpDQojIyMNCnRpdGxlIDwtIHRhZ3MkZGl2KA0KICBIVE1MKCc8Zm9udCBjb2xvciA9ICJjaG9jb2xhdGUiIHNpemUgPTQ+PGI+UGhpbGFkZWxwaGlhIENyaW1lIENhc2UgTG9jYXRpb25zIDIwMjM8L2I+PC9mb250PicpDQogICkNCkFubm90YXRlV3JhcHBlciA8LSB0YWdzJGRpdigNCiAgIEhUTUwoJzxjZW50ZXI+PGltZyBib3JkZXI9IjAiIGFsdD0iSW1hZ2VUaXRsZSIgc3JjPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXpoZW5lZ2hhbi9haGVuZWdoYW4vbWFpbi9pbWFnZXMvcGhpbGFkZWxwaGlhLnBuZyIgd2lkdGg9IjE1MCIgaGVpZ2h0PSIxMDAiPjxjZW50ZXI+DQogICAgPGZvbnQgY29sb3IgPSAiZGFya2dyZWVuIj4yMDIzPC9mb250PicpDQogKQ0KZmF0YWxDb2xvciA8LSByZXAoIiNEQzI2N0YiKQ0KZmF0YWxDb2xvclt3aGljaChjcmltZS4yMDIzJGZhdGFsPT0iTm9uZmF0YWwiKV0gPC0gIiM2NDhGRkYiDQpmYXRhbENvbG9yW3doaWNoKGNyaW1lLjIwMjMkZmF0YWw9PSJGYXRhbCIpXSA8LSAiI0RDMjY3RiINCiMjDQpsYWJlbC5tc2cgPC0gcGFzdGUocGFzdGUoIlN0cmVldDoiLCBjcmltZS4yMDIzJHN0cmVldF9uYW1lKSwNCiAgICAgICAgICAgICAgICAgICBwYXN0ZSgiPGJyPiBaSVAgQ29kZToiLCBjcmltZS4yMDIzJHppcF9jb2RlKSwNCiAgICAgICAgICAgICAgICAgICBwYXN0ZSgiPGJyPiBOZWlnaGJvcmhvb2Q6IiwgY3JpbWUuMjAyMyRuZWlnaGJvcmhvb2QpLA0KICAgICAgICAgICAgICAgICAgIHBhc3RlKCI8YnI+IExvbmdpdHVkZToiLCBjcmltZS4yMDIzJGxuZyksDQogICAgICAgICAgICAgICAgICAgcGFzdGUoIjxicj4gTGF0aXR1ZGU6IiwgY3JpbWUuMjAyMyRsYXQpKQ0KIyMNCmxlYWZsZXQoY3JpbWUuMjAyMykgJT4lDQogIGFkZFRpbGVzKCkgJT4lIA0KICBzZXRWaWV3KGxuZz1tZWFuKGNyaW1lLjIwMjMkbG5nKSwgbGF0PW1lYW4oY3JpbWUuMjAyMyRsYXQpLCB6b29tID0gMTMpICU+JQ0KICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRFc3JpLldvcmxkR3JheUNhbnZhcykgJT4lDQogIGFkZENpcmNsZU1hcmtlcnMoDQogICAgICAgICAgICB+bG5nLCANCiAgICAgICAgICAgIH5sYXQsDQogICAgICAgICAgICBjb2xvciA9IGZhdGFsQ29sb3IsDQogICAgICAgICAgICBzdHJva2UgPSBGQUxTRSwgDQogICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAuNCwNCiAgICAgICAgICAgIHBvcHVwID0gfmxhYmVsLm1zZywNCiAgICAgICAgICAgIGxhYmVsID0gfnBhc3RlKCJTdHJlZXQ6IiwgY3JpbWUuMjAyMyRzdHJlZXRfbmFtZSkpICAlPiUNCiAgYWRkTGVnZW5kKHBvc2l0aW9uID0gImJvdHRvbXJpZ2h0IiwgDQogICAgICAgICAgICBjb2xvcnMgPSBjKCIjREMyNjdGIiwgIiM2NDhGRkYiKSwNCiAgICAgICAgICAgIGxhYmVscz0gYygiRmF0YWwiLCAiTm9uLUZhdGFsIiksDQogICAgICAgICAgICB0aXRsZT0gIkNyaW1lIFN0YXR1cyIsDQogICAgICAgICAgICBvcGFjaXR5ID0gMC40KSAlPiUNCiAgYWRkQ29udHJvbCh0aXRsZSwgcG9zaXRpb24gPSAidG9wcmlnaHQiKSAlPiUNCiAgYWRkQ29udHJvbChBbm5vdGF0ZVdyYXBwZXIsIHBvc2l0aW9uID0gImJvdHRvbWxlZnQiKQ0KYGBgDQoNCkFuIGludGVyYWN0aXZlIGxlYWZsZXQgbWFwIHdhcyBjcmVhdGVkIHRvIHBsb3QgbG9jYXRpb25zIG9mIGNyaW1lcyB0aGF0IHRvb2sgcGxhY2UgaW4gUGhpbGFkZWxwaGlhLCBQQSBpbiAyMDIzLiBDcmltZXMgd2VyZSBtYXJrZWQgd2l0aCBkaWZmZXJlbnQgY29sb3JzIHRvIHJlcHJlc2VudCBjcmltZXMgdGhhdCB3ZXJlIGZhdGFsIGFuZCBjcmltZXMgdGhhdCB3ZXJlbid0LiBPdGhlciByZWxldmFudCBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgZWFjaCBjcmltZSBpbiAyMDIzLCBzdWNoIGFzIHRoZSBzdHJlZXQgYW5kIG5laWdoYm9yaG9vZCB3aGVyZSB0aGV5IHdlcmUsIGlzIGluY2x1ZGVkIGluIGEgcG9wdXAgKGNsaWNrIGVhY2ggcG9pbnQpLg0KDQpNb3N0IG9mIHRoZSBwb2ludHMgdGhlbXNlbHZlcyBhcHBlYXIgdG8gYmUgbWFpbmx5IGluIHR3byBsYXJnZSBjbHVzdGVycyBvbiBlaXRoZXIgc2lkZSBvZiB0aGUgcml2ZXIgd2hpbGUgdGhlIG90aGVycyBhcmUgbG93ZXIgZG93biB0aGUgcml2ZXIgb3IgZXZlbiBtb3JlIHJpZ2h0IG9mIHRoZSBjbHVzdGVyIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSByaXZlci4gVGhlcmUgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHRvbyBtdWNoIHZhcmlhdGlvbiBvciBhbnkgb2J2aW91cyBwYXR0ZXJucyBpbiBzcHJlYWQgb2YgZmF0YWwgYW5kIG5vbi1mYXRhbCBjcmltZXMgYWNyb3NzIFBoaWxhZGVscGhpYSBpbiAyMDIzLiBNb3N0IG9mIHRoZSBmYXRhbCBhbmQgbm9uLWZhdGFsIGNyaW1lIGxvY2F0aW9ucyBzZWVtIHRvIGJlIHJlbGF0aXZlbHkgY2xvc2UgdG8gb25lIGFub3RoZXIuIFNvbWUgcG9pbnRzLCB3aGV0aGVyIGZhdGFsIG9yIG5vbi1mYXRhbCwgdGVuZCB0byBvdmVybGFwIHNpbmNlIHNvbWUgY3JpbWVzIGhhdmUgbW9yZSB0aGFuIG9uZSB2aWN0aW0gb3IgY3JpbWluYWwuIE5vbi1mYXRhbCBjcmltZXMgc2VlbSB0byBiZSBtb3JlIGZyZXF1ZW50IGNvbXBhcmVkIHRvIGZhdGFsIGNyaW1lcywgYW5kIG9ubHkgYSBmZXcgbm9uLWZhdGFsIGNyaW1lcyB0ZW5kIHRvIHN0cmV0Y2ggb3V0IHBhc3QgdGhlIGFmb3JlbWVudGlvbmVkIGNsdXN0ZXJzLg0K